//
//  CZEmoticonKeyBoardViewModel.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/26.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit
//每一页有多少行
let CZEmoticonKeyBoardViewModelMaxRow = 3
//每一行有多少列
let CZEmoticonKeyBoardViewModelMaxCol = 7
//每一页显示多少个表情按钮
let CZEmoticonKeyBoardViewModelEmoticonButtonCount = CZEmoticonKeyBoardViewModelMaxRow * CZEmoticonKeyBoardViewModelMaxCol - 1

class CZEmoticonKeyBoardViewModel: NSObject {
    
    
 /// 设置一个单利,可以方便的获取数据
    static let sharedViewModel: CZEmoticonKeyBoardViewModel = CZEmoticonKeyBoardViewModel()
    //懒加载一个path
    private lazy var path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("recentEmotiocn.archive")
    
    //定义一个数组记录默认表情
    
    //首先设置表情的bundle
     lazy var emoticonBundle: NSBundle = {
        let path = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)!
        
        //通过文件的路径获取对应的bundle,这里主要需要强行解包
       return NSBundle(path: path)!
        
    }()
    
    
    
    //通过表情字符串找到对应的表情模型
    func emoticonWithChs(chs: String) -> CZEmoticonModel? {
        //遍历默认表情
        for value in defaultEmoticons {
            if value.chs == chs {
                return value
            }
        }
        
        //遍历浪小花表情
        for value in lxhEmoticons {
            if value.chs == chs {
                return value
            }
            
        }
        
        return nil
    }
    
    
    
    
    
    
    
    
    //保存最近的表情
    func saveRecentEmoticon(emoticon: CZEmoticonModel){
        
        //将最近传入的表情模型添加到最近表情的数组里面去
//        allEmoticons[0][0].insert(emoticon, atIndex: 0)
        //获取第一组的第一组的第一页的元素
        var emoticons = allEmoticons[0][0]
        //2.去重,去掉多余的20个表情
        //为什么这里不直接判断model是否相同呢
        
        //注意最好不要在遍历的时候,移除对象里面的元素,这样会造成越界的错误,因为你还在遍历但是实际上内存对应下表缩小了
        
//        for (index,value) in emoticons.enumerate(){
//            //直接将后面重复的移除,添加新的
//            if value == emoticon {
//                emoticons.removeAtIndex(index)
//            }
//    
//        }
        
        //取到重读表情的数组
        let repeatEmoticons = emoticons.filter { (value) -> Bool in
//            if value == emoticon {
//                return true
//            }
//            return false
            return value == emoticon
        }
        //移除重复
        for value in repeatEmoticons {
            if let index = emoticons.indexOf(value) {
                emoticons.removeAtIndex(index)
            }
            
        }
        
        
        
        
        //将内容添加到数组中去,而且是添加到第一个
        emoticons.insert(emoticon, atIndex: 0)
        //去掉多余的20个表情
        while emoticons.count > 20 {
            emoticons.removeLast()
        }
        //将这个数组赋值回去
        allEmoticons[0][0] = emoticons
        
        //3.使用归档的方法保存最近的表情
        
        NSKeyedArchiver.archiveRootObject(emoticons, toFile: path)
        
        
        
    }
    

    lazy var allEmoticons: [[[CZEmoticonModel]]] = {
        return
        [
            [self.recentEmoticons],
            self.emticonPageArray(self.defaultEmoticons),
            self.emticonPageArray(self.emojiEmoticons),
            self.emticonPageArray(self.lxhEmoticons)
        
        ]
    }()
    //定义一个最近表情数组
    lazy var recentEmoticons: [CZEmoticonModel] = []
    
    lazy var defaultEmoticons: [CZEmoticonModel] = {
        return self.emoticonWithPath("default/info.plist")
    }()
    
    lazy var emojiEmoticons: [CZEmoticonModel] = {
       
        return self.emoticonWithPath("emoji/info.plist")
        
    }()
    lazy var lxhEmoticons: [CZEmoticonModel] = {
       return self.emoticonWithPath("lxh/info.plist")
    }()
    
    //创建一个方法,将上面的转换成每页有20个表情的2维数组
    private func emticonPageArray(emoticons: [CZEmoticonModel])->[[CZEmoticonModel]]{
        //这里需要我们进行剪切数组
        let pageCount = (emoticons.count - 1) / 20 + 1
        //定义一个可变的数组,截取之后,添加进去
        var result: [[CZEmoticonModel]] = [[CZEmoticonModel]]()
        
        for i in 0..<pageCount{
            //从哪里开始截取
            let loca = 20 * i
            //截取长度
            var length = 20
            
            //判断数组是否越界
            
            //这个越界是怎么处理的呢,就是loca+length > emoticons.count//这里一定要注意
            if loca + length > emoticons.count{
                length = emoticons.count - loca
            }
            //截取数组,注意这里需要进行强转
            let childArray = (emoticons as NSArray).subarrayWithRange(NSMakeRange(loca, length)) as! [CZEmoticonModel]
            result.append(childArray)
            
        }
        
//        print(result)
        
        return result
        
    }
    
    
    
    //将上面的获取数据抽取方法
//    let a = CZEmoticonModel
    private func emoticonWithPath(filePath: String) -> [CZEmoticonModel]{
        
        //1.取到info.plist文件的路径
//        let path = self.emoticonBundle.pathForResource(filePath, ofType: nil)
        
        //读取文件获取数据
        //1.读取默认表情的plist路径
        let path = self.emoticonBundle.pathForResource(filePath, ofType: nil)!
        
        //读取数据,进行模型的转化
        let dicts = NSArray(contentsOfFile: path)!
        
        //创建一个临时可变的数组
        var tempArray = [CZEmoticonModel]()
        for value in dicts {
            
            let model = CZEmoticonModel(dict: (value as! [String: AnyObject]))
            //设置改表情对应的文件夹的路径,这个方法是截取文件的后面的部分,保留前面的名字
            
            let foldName = (filePath as NSString).stringByDeletingLastPathComponent
//            print(foldName)
            model.folderName = foldName
            
            
            tempArray.append(model)
            
        }
        
        return tempArray

        
        
    }
    
    
    
    
    

}
